// 定义一个拦截器的工厂函数，接受一个字段名作为参数
import {Injectable, NestInterceptor, ExecutionContext} from "../common";
import multer from "multer";

export function FileInterceptor(fieldName: string):any {

    @Injectable()
    class FileInterceptor implements NestInterceptor {
        // 实现了NestInterceptor里边的intercept方法
        async intercept(context: ExecutionContext, next: any) {
            const {getRequest, getResponse} = context.switchToHttp();
            // 当需要处理单个文件上传的时候可以使用single(fieldName)会得到一个Express中间件函数
            const upload = multer().single(fieldName);
            // 使用promise包装muter单文件上传中间件
            await new Promise<void>((resolve, reject) => {
                upload(getRequest(), getResponse(), (err: any) => {
                    err ? reject(err) : resolve();
                });
            })
            // 等异步上传完成后，在调用next.handle()向后执行处理请求
            return next.handle();
        }
    }

    return new FileInterceptor();
}
